import { app, BrowserWindow, ipcMain } from 'electron';
import * as url from 'url';
import * as path from 'path';
import  _basepath from '../basepath';
import { IP } from '../renderer/utils/ip';
import store from 'electron-store';
import sleep from "sleep-promise";
// import ip from 'ip';
// 保持对window对象的全局引用，如果不这么做的话，当JavaScript对象被
// 垃圾回收的时候，window对象将会自动的关闭
console.log("userData", app.getPath("userData"));
let win;
const entryPath = app.isPackaged 
    ? path.join(_basepath, 'resources/app.asar', 'dist/renderer/index.html') 
    : path.join(_basepath, 'dist/renderer/index.html')
const winURL = process.env.NODE_ENV === 'development'
  ? `http://localhost:9080`
  : entryPath
  console.log(winURL);
// const winURL = `file://${path.join(_basepath, 'dist/renderer')}/index.html`;
function createWindow () {
    // 创建浏览器窗口。
    win = new BrowserWindow({
        width: 800,
        height: 600,
        webPreferences: {
            nodeIntegration: true
        }
    })

    // 加载index.html文件
    
    win.loadURL(winURL);
    // 打开开发者工具
    win.webContents.openDevTools()
    console.log(123);
    // 当 window 被关闭，这个事件会被触发。
    win.on('closed', () => {
        // 取消引用 window 对象，如果你的应用支持多窗口的话，
        // 通常会把多个 window 对象存放在一个数组里面，
        // 与此同时，你应该删除相应的元素。
        win = null
    })
}

// Electron 会在初始化后并准备
// 创建浏览器窗口时，调用这个函数。
// 部分 API 在 ready 事件触发后才能使用。
app.on('ready', createWindow)

// 当全部窗口关闭时退出。
app.on('window-all-closed', () => {
    // 在 macOS 上，除非用户用 Cmd + Q 确定地退出，
    // 否则绝大部分应用及其菜单栏会保持激活。
    if (process.platform !== 'darwin') {
        app.quit()
    }
})

app.on('activate', () => {
    // 在macOS上，当单击dock图标并且没有其他窗口打开时，
    // 通常在应用程序中重新创建一个窗口。
    if (win === null) {
        createWindow()
    }
})

ipcMain.on('refresh', async (event, arg) => {
    console.log("消息",arg) // prints "ping"
    // event.reply('asynchronous-reply', 'pong')
    const ip = new IP(arg);
    const storage = new store();
    const prevIp = storage.get("prevIp", "");
    const currentIp: string = await getCurrentIp();
    console.log("prevIp", prevIp, "currentIp", currentIp);
    // log.info("prevIp", prevIp, "currentIp", currentIp)
    if(prevIp == '' || prevIp != currentIp) {
        await ip.addWhite(currentIp);
        storage.set("prevIp", currentIp);
    }
    await ip.refresh();
    const list = storage.get(arg+"_pool");
    event.returnValue = JSON.stringify(list)
})

async function getCurrentIp(errorTime = 0): Promise<string> {
    const ip = new IP("getCurrentIp");
    try {
        const res = await ip.request("https://oa.caugoo.com/api/ip", {});;
        const ipremote = res.data;
        // log.info("currentIp", ipremote)
        console.log(ipremote);
        return ipremote
    } catch (error) {
        console.log("getCurrentIpError", error);
        // log.error("getCurrentIpError", error)
        if (errorTime < 3) {
            errorTime++
            await sleep(3000)
            console.log("regetCurrentIp", "errorTime", errorTime)
            let res = await getCurrentIp(errorTime)
            return res;
        } else {
            const storage = new store();
            const prevIp: string | any = storage.get("prevIp", "");
            return prevIp;
        }
        
    }
    // storage.set("getCurrentIp", ipremote);
}

// 在这个文件中，你可以续写应用剩下主进程代码。
// 也可以拆分成几个文件，然后用 require 导入。